package Server.ExtComponents.MinaEngine.core;

import Server.ExtComponents.MinaEngine.config.MServerConfig;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

/**
 * @author :石头哥哥<br/>
 *         Project:FrameServer1.0
 *         Date: 13-5-19
 *         Time: 下午4:27
 * A {@link org.apache.mina.filter.codec.ProtocolDecoder} that cumulates the content of received
 * buffers to a <em>cumulative buffer</em> to help users implement decoders.
 *  it's easiest to wait until all data is available
 */
public class MServerProtocolDecoder extends CumulativeProtocolDecoder {



    /**
     * decode package :
     *        lengthFieldLength:2 (byte)
     *
     * Implement this method to consume the specified cumulative buffer and
     * decode its content into message(s).
     *
     * @param in the cumulative buffer
     * @return <tt>true</tt> if and only if there's more to decode in the buffer
     *         and you want to have <tt>doDecode</tt> method invoked again.
     *         Return <tt>false</tt> if remaining data is not enough to decode,
     *         then this method will be invoked again when more data is cumulated.
     * @throws Exception if cannot decode <tt>in</tt>.
     *
     *
     */
    @Override
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
        //now let's decode message to the  IoBuffer;
        // mark <= position <= limit <= capacity
        // if remaining data is not enough to decode （value:MServerConfig.lengthFieldLength=2）;
        if (in.remaining()< MServerConfig.lengthFieldLength){
            return false;
        }
        int pack_length=in.getUnsignedShort();//get pack length ,increments the position by two
        //the dataLength is not enough to decode
        if (in.remaining()<pack_length){
            return false;
        }
        byte[]packMessage=new byte[pack_length];
        in.get(packMessage);
        //warp byte array to IoBuffer  ,add to the messageQueue
        out.write(IoBuffer.wrap(packMessage));
        out.flush(session.getFilterChain().getNextFilter("protocolCodecFilter"),session);//Flushes all messages to the NextFilter---->executors logic
        return true;  //decode ok
    }
}
